package com.ym.dto;

import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;

/**
 * @Author: ym
 * @Description:
 * @Date: 2024/5/29 13:40
 * @Version: 1.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class WxPayDTO extends BaseWxPayDTO {


    private static final long serialVersionUID = 741676215366447465L;
    /**
     * 服务商id
     */
    @NotNull(message = "服务商id-不能为空")
    private Long taxId;

    /**
     * 批次id
     */
    @NotBlank(message = "批次号-不能为空")
    @Size(max = 32, message = "批次号-长度不能大于32")
    private String batchNo;

    /**
     * 商户APPID
     */
    @NotBlank(message = "appid-不能为空")
    @Size(max = 200, message = "appid-长度不能大于200")
    private String appid;

    /**
     * 批次名称
     */
    @NotBlank(message = "批次名称-不能为空")
    @Size(max = 32, message = "批次名称-长度不能大于32")
    private String batchName;

    /**
     * 批次备注
     */
    @NotBlank(message = "批次备注-不能为空")
    @Size(max = 32, message = "批次备注-长度不能大于32")
    private String batchRemark;

    /**
     * 转账金额单位为“分”。
     * 转账总金额必须与批次内所有明细转账金额之和保持一致，否则无法发起转账操作
     */
    @NotNull(message = "转账总金额-不能为空")
    @Min(value = 10, message = "转账总金额-不能小于10分")
    private Integer totalAmount;

    @NotNull(message = "转账总笔数")
    @Min(value = 1, message = "转账总笔数-不能小于1")
    @Max(value = 1000, message = "转账总笔数-不能大于1000")
    private Integer totalNum;

    /**
     * 转账场景ID
     */
    @Size(max = 36, message = "转账场景ID-长度不能大于36")
    private String transferSceneId;

    /**
     * 回调地址
     */
    @Size(max = 500, message = "回调地址-长度不能大于500")
    private String notifyUrl;

    /**
     * 转账明细列表
     */
    @NotEmpty(message = "转账明细列表-不能为空")
    @Size(max = 1000, message = "转账明细列表-长度不能大于1000")
    @Valid
    private List<WxTransferDetail> transferDetailList;

    @Data
    public static class WxTransferDetail {

        /**
         * 商家明细单号
         */
        @NotBlank(message = "明细id-不能为空")
        @Size(max = 32, message = "明细id-长度不能大于32")
        private String transferNo;

        /**
         * 转账金额
         */
        @NotNull(message = "转账金额-不能为空")
        @Min(value = 30, message = "转账金额-不能小于30分")
        private Integer transferAmount;

        /**
         * 转账备注
         * 【转账备注】 单条转账备注（微信用户会收到该备注），UTF8编码，最多允许32个字符
         */
        @NotBlank(message = "转账备注-不能为空")
        @Size(max = 32, message = "转账备注-长度不能大于32")
        private String transferRemark;

        /**
         * 【收款用户openid】
         * 商户appid下，某用户的openid
         */
        @NotBlank(message = "openid-不能为空")
        @Size(max = 64, message = "openid-长度不能大于64")
        private String openid;

        /**
         * 【收款用户姓名】
         * 收款方真实姓名。支持标准RSA算法和国密算法，公钥由微信侧提供
         * 明细转账金额<0.3元时，不允许填写收款用户姓名
         * 明细转账金额 >= 2,000元时，该笔明细必须填写收款用户姓名
         * 同一批次转账明细中的姓名字段传入规则需保持一致，也即全部填写、或全部不填写
         * 若商户传入收款用户姓名，微信支付会校验用户openID与姓名是否一致，并提供电子回单
         */
        private String userName;
    }


}
